﻿

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text.RegularExpressions;
using Domain.Entidades;
using Domain.Interfaces.Repositorios;
using Domain.Interfaces.Servicos;


namespace Domain.Servicos
{
    public class AfastamentoService : ServiceBase<usuarios_afastados>, IAfastamentoService
    {
        private readonly IAfastamentoRepository _afastamentoRepository;
        private readonly IUsuarioService _usuarioservice;


        public AfastamentoService(IAfastamentoRepository afastamentoRepository,IUsuarioService usuarioservice) : base(afastamentoRepository)
        {
            _afastamentoRepository = afastamentoRepository;
            _usuarioservice= usuarioservice;
        }

        public  IEnumerable<tipos_afastamento> busca_tipos() 
        {

            try
            {
                return _afastamentoRepository.busca_tipos();
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

        }


        public void Inserir(usuarios_afastados afastamento)
        {

            try
            {

                if (afastamento.tip_codigo == 5)
                {
                    afastamento.data_fim = null;
                }
                _afastamentoRepository.Inserir(afastamento, _usuarioservice.GetUsuarioLogado(0));
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        public IEnumerable<VW_usuarios_afastados> Listar(DateTime dt1, DateTime dt2, int unidade)
        {

            try
            {
               return _afastamentoRepository.Listar(dt1,dt2,unidade);
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public void Editar(usuarios_afastados afastamento)
        {

            try
            {


                usuarios_afastados afastamento_atual = _afastamentoRepository.carrega_busca(int.Parse(afastamento.codigo.ToString()));
                afastamento.data_cadastro = afastamento_atual.data_cadastro;
                


                if (afastamento.data_inicio.Date <= DateTime.Now.Date)
                {
                    throw new Exception("Ñão é possível editar este registro pois uma ação ja foi realizada.");
                }


                if (afastamento.data_fim != null)
                {
                    if (DateTime.Parse(afastamento.data_fim.ToString()).Date <= DateTime.Now.Date)
                    {
                        throw new Exception("Ñão é possível editar este registro pois uma ação ja foi realizada.");

                    }
                    else
                    {
                        if (afastamento_atual.usu_codigo != afastamento.usu_codigo && DateTime.Parse(afastamento.data_fim.ToString()).Date <= DateTime.Now.Date && afastamento.data_inicio.Date <= DateTime.Now.Date)
                        {
                            throw new Exception("Ñão é possível a troca do colaborador pois uma ação ja foi realizada.");

                        }

                    }

                }

               
                _afastamentoRepository.Editar(afastamento,_usuarioservice.GetUsuarioLogado(0));
            }
            catch (Exception ex)
            {
                

                throw ex;
            }
        }


        public usuarios_afastados carrega_busca(int codigo)
        {
            try
            {
                usuarios_afastados afastados = _afastamentoRepository.carrega_busca(codigo);
                
                afastados.usu_nome = afastados.usuario.usu_login + " - " + afastados.usuario.usu_nome;
                return afastados;

            }
            catch (Exception ex)
            {
                
                throw ex;
            }

        }


        public void Deletar(usuarios_afastados afastamento)
        {
            try
            {

               

                if (afastamento.tip_codigo == 5 && afastamento.data_inicio.Date <= DateTime.Now.Date)
                {

                    throw new Exception("Ñão é possível deletar este registro pois a ação ja foi realizada.");
                }

                if (afastamento.data_fim <= DateTime.Now.Date)
                {
                    throw new Exception("Ñão é possível deletar este registro pois a ação ja foi realizada.");

                }

                _afastamentoRepository.Deletar(afastamento,_usuarioservice.GetUsuarioLogado(0));
            }
            catch (Exception ex)
            {
                
                throw ex;
            }


        }


    }
}
